// 改造为Promise方式，更便于处理异步流程（兼容iPhone Safari）
import {Message} from "element-ui";

function getUserMedia(constraints) {
    return new Promise((resolve, reject) => {
        // 检测浏览器支持
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            navigator.mediaDevices.getUserMedia(constraints).then(resolve).catch(reject);
        } else {
            // 兼容旧版API（主要针对旧版Safari）
            const legacyApi = navigator.webkitGetUserMedia ||
                navigator.mozGetUserMedia ||
                navigator.getUserMedia;

            if (!legacyApi) {
                reject(new Error('浏览器不支持媒体设备访问'));
                return;
            }

            legacyApi.call(navigator, constraints, resolve, reject);
        }
    });
}

/**
 * 设置视频流（兼容iPhone Safari）
 * @param {MediaStream} stream - 目标媒体流
 * @param {string} deviceId - 摄像头设备ID
 * @param {number} [width=1280] - 理想宽度
 * @param {number} [height=720] - 理想高度
 * @returns {Promise<void>}
 */
export async function setVideoStream(stream, deviceId, width = 1280, height = 720) {
    try {
        // 1. 验证输入（iPhone Safari对无效参数容错性差）
        if (!stream || !(stream instanceof MediaStream)) {
            throw new Error('无效的媒体流对象');
        }
        if (!deviceId) {
            throw new Error('摄像头设备ID不能为空');
        }

        // 2. 停止并移除旧视频轨道（关键：避免iPhone设备占用冲突）
        stream.getVideoTracks().forEach(track => {
            track.stop(); // 必须停止，否则iPhone可能拒绝新请求
            stream.removeTrack(track);
        });

        // 3. 适配iPhone的约束条件（避免请求过高分辨率导致失败）
        const constraints = {
            video: {
                deviceId: { exact: deviceId },
                width: { ideal: width, max: 1920 }, // 限制最大分辨率
                height: { ideal: height, max: 1080 },
                facingMode: 'environment' // 对iPhone摄像头更友好的默认参数
            },
            audio: false
        };

        // 4. 请求新视频流（必须在用户交互事件中调用，否则iPhone会拒绝）
        const videoStream = await getUserMedia(constraints);

        const newVideoTrack = videoStream.getVideoTracks()[0];

        if (!newVideoTrack) {
            throw new Error('无法获取摄像头轨道');
        }

        // 5. 监听轨道状态（处理iPhone摄像头可能的中断）
        newVideoTrack.addEventListener('mute', () => {
            console.warn('视频轨道已静音（可能是iPhone摄像头被占用）');
        });

        // 6. 添加新轨道到流
        stream.addTrack(newVideoTrack);

        // 7. 清理临时流（仅保留轨道引用）
        setTimeout(() => {
            videoStream.getTracks().forEach(track => {
                if (track !== newVideoTrack) track.stop();
            });
        }, 1000);

    } catch (err) {
        console.error("切换视频流失败:", err);
        // 针对iPhone常见错误的友好提示
        const errorMap = {
            'NotAllowedError': '请在设置中允许访问摄像头（设置 → 隐私与安全性 → 摄像头）',
            'NotFoundError': '未找到指定摄像头，请尝试其他设备',
            'NotReadableError': '摄像头被占用，请关闭其他使用摄像头的应用'
        };
        Message.error(errorMap[err.name] || `切换摄像头失败: ${err.message}`);
    }
}

/**
 * 设置音频流（兼容iPhone Safari）
 * @param {MediaStream} stream - 目标媒体流
 * @param {string} deviceId - 麦克风设备ID
 * @returns {Promise<void>}
 */
export async function setAudioStream(stream, deviceId) {
    try {
        // 1. 验证输入
        if (!stream || !(stream instanceof MediaStream)) {
            throw new Error('无效的媒体流对象');
        }
        if (!deviceId) {
            throw new Error('麦克风设备ID不能为空');
        }

        // 2. 停止并移除旧音频轨道
        stream.getAudioTracks().forEach(track => {
            track.stop();
            stream.removeTrack(track);
        });

        // 3. 请求新音频流（适配iPhone麦克风权限）
        const audioStream = await getUserMedia({
            audio: {
                deviceId: { exact: deviceId },
                echoCancellation: true, // 开启回声消除（iPhone通话场景友好）
                noiseSuppression: true  // 开启降噪
            },
            video: false
        });

        const newAudioTrack = audioStream.getAudioTracks()[0];

        if (!newAudioTrack) {
            throw new Error('无法获取麦克风轨道');
        }

        // 4. 监听麦克风静音状态（iPhone有物理静音开关）
        newAudioTrack.addEventListener('mute', () => {
            alert('麦克风已静音，请检查设备开关');
        });

        // 5. 添加新轨道到流
        stream.addTrack(newAudioTrack);

        // 6. 清理临时流
        setTimeout(() => {
            audioStream.getTracks().forEach(track => {
                if (track !== newAudioTrack) track.stop();
            });
        }, 1000);

    } catch (err) {
        console.error("切换音频流失败:", err);
        // 针对iPhone麦克风的错误提示
        const errorMap = {
            'NotAllowedError': '请在设置中允许访问麦克风（设置 → 隐私与安全性 → 麦克风）',
            'NotFoundError': '未找到指定麦克风，请尝试其他设备',
            'NotReadableError': '麦克风被占用，请关闭其他使用麦克风的应用'
        };
        alert(errorMap[err.name] || `切换麦克风失败: ${err.message}`);
    }
}
